package com.blog.cmrpersonalblog.strategy.upload;

import com.blog.cmrpersonalblog.dto.file.respnose.FileUploadResponse;
import com.blog.cmrpersonalblog.enums.FileUploadType;
import org.springframework.web.multipart.MultipartFile;

/**
 * 文件上传策略接口
 */
public interface FileUploadStrategy {
    
    /**
     * 获取支持的上传类型
     */
    FileUploadType getSupportedType();
    
    /**
     * 上传文件
     * 
     * @param file 要上传的文件
     * @param userId 用户ID（可选）
     * @param extraParams 额外参数（可选）
     * @return 上传结果
     */
    FileUploadResponse upload(MultipartFile file, Long userId, Object... extraParams);
    
    /**
     * 验证文件
     * 
     * @param file 要验证的文件
     * @return 验证结果
     */
    default boolean validateFile(MultipartFile file) {
        if (file == null || file.isEmpty()) {
            return false;
        }
        
        // 检查文件大小
        if (file.getSize() > getSupportedType().getMaxSize()) {
            return false;
        }
        
        // 检查文件类型
        return isValidFileType(file);
    }
    
    /**
     * 检查文件类型是否有效
     * 
     * @param file 要检查的文件
     * @return 是否有效
     */
    boolean isValidFileType(MultipartFile file);
    
    /**
     * 生成文件名
     * 
     * @param originalFileName 原始文件名
     * @param userId 用户ID
     * @param extraParams 额外参数
     * @return 生成的文件名
     */
    String generateFileName(String originalFileName, Long userId, Object... extraParams);
    
    /**
     * 删除文件
     * 
     * @param relativePath 文件相对路径
     * @return 是否删除成功
     */
    boolean deleteFile(String relativePath);
}
